﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Collections;
using System.IO;

namespace PPE_gestion_commercial
{
    public partial class Commande : Form
    {
        public string typeReduction;
        public int opereduc;
        
        class Reduc //utilisée pour la gestion des reductions
        {
            public int reduction;
            public string typeReduction;
            public int index;

            public Reduc(int r, string tr, int i)
            {
                reduction = r;
                typeReduction = tr;
                index = i;
            }
        }

        private string strconn = "server=78.241.116.47;Network Library=DBMSSOCN; database=gestion; User Id=Gestion; Password=gestion";
        //private string strconn = "server=FRACO-PC; database=gestion; trusted_connection=true";
        
        SqlConnection connex;
        SqlDataReader dr;
        SqlDataReader dr2;
        
        public static string selection;
        private SqlCommand cmd;

        public Commande()
        {
            InitializeComponent();
        }

        public void rafraichirclients() //rafraichis dataGridView client
        {
            if (connex.State == ConnectionState.Closed) connex.Open();
            int j = 0;
            string sql = "Select NomClient,PrenomClient,IdClient from client";
            cmd = new SqlCommand(sql, connex);
            dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                this.dataGridView1.RowCount = j + 1;
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    this.dataGridView1.Rows[j].Cells[i].Value = dr[i].ToString();
                }
                j++;
            }
            dr.Close();
            connex.Close();
        }

        public void rafraichirProduit() //rafraichis dataGridView produit
        {
            if (connex.State == ConnectionState.Closed) connex.Open();
            int j = 0;

            string sql2 = "Select NomProduit,PrixP,QuantiteP,IdProduit from produit";
            cmd = new SqlCommand(sql2, connex);
            dr2 = cmd.ExecuteReader();
            dataGridView2.RowCount = 1;
            dataGridView2.Rows.Clear();

            while (dr2.Read())
            {
                this.dataGridView2.RowCount = j + 1;
                for (int i = 0; i < dr2.FieldCount; i++)
                {
                    this.dataGridView2.Rows[j].Cells[i].Value = dr2[i].ToString();
                }
                j++;
            }

            dr2.Close();
            connex.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.ColumnCount = 3;
            dataGridView2.ColumnCount = 4;
            dataGridViewCommande.ColumnCount = 7;

            dataGridViewCommande.Columns[0].Name = "Nom du produit";
            dataGridViewCommande.Columns[1].Name = "Prix unitaire";
            dataGridViewCommande.Columns[2].Name = "Quantité";
            dataGridViewCommande.Columns[3].Name = "Prix total";
            dataGridViewCommande.Columns[4].Name = "Id produit";
            dataGridViewCommande.Columns[4].Visible = false;
            dataGridViewCommande.Columns[5].Name = "Ristourne";
            dataGridViewCommande.Columns[6].Name = "Type ristourne";
            dataGridViewCommande.Columns[6].Visible = false;
            

            dataGridView1.Columns[0].Name = "Nom du Client";
            dataGridView1.Columns[1].Name = "Prenom du Client";
            dataGridView1.Columns[2].Name = "Id client";
            dataGridView1.Columns[2].Visible = false;
            
            dataGridView2.Columns[0].Name = "Nom du Produit";
            dataGridView2.Columns[1].Name = "Prix";
            dataGridView2.Columns[2].Name = "Quantité";
            dataGridView2.Columns[3].Name = "Id produit";
            dataGridView2.Columns[3].Visible = false;

            connex = new SqlConnection();
            connex.ConnectionString = strconn;
            connex.Open();

            rafraichirclients();
            rafraichirProduit();

            dataGridView1.AutoResizeColumns();
            dataGridView2.AutoResizeColumns();
        }

        //afficher les infos client en double cliquant sur eux
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int colonne = e.ColumnIndex;
            int ligne = e.RowIndex;

            selection = this.dataGridView1.Rows[ligne].Cells[2].Value.ToString();
            DonneesClient f3 = new DonneesClient(selection);
            f3.Show();
        }
        //recalculer le prix de la commande actuelle
        private int CalculerNouveauPrixTotal()
        {
            Int32 Total = 0;
            foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
            {
                Total = Total + Convert.ToInt16(LigneCommande.Cells[2].Value) * Convert.ToInt16(LigneCommande.Cells[1].Value);
            }
            TextBoxTotalPrixCommande.Text = Convert.ToString(Total);
            return Total;
        }

        private void buttonCommande_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewCell cellules in dataGridView2.SelectedCells) // on selectionne toutes les lignes selectionées partielement
            {
                dataGridView2.Rows[cellules.RowIndex].Selected = true;
            }
            foreach( DataGridViewRow dg in dataGridView2.SelectedRows)// dg == ligne des produits
            {
                //verification si la ligne est deja presente dans les lignes de la commande
                bool dejaCommande = false;
                foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
                {
                    if (LigneCommande.Cells[4].Value == dg.Cells[3].Value)//la ligne existe deja dans la commande
                    {
                        dejaCommande = true;
                        if ((Convert.ToInt32(LigneCommande.Cells[2].Value) + Convert.ToInt32(numericUpDownCommande.Value)) > Convert.ToInt32(dg.Cells[2].Value)) //si la quantité demandée depasse la quantitée disponible
                        {
                            LigneCommande.Cells[2].Value = Convert.ToInt32(dg.Cells[2].Value);
                            LigneCommande.Cells[3].Value = Convert.ToInt32(LigneCommande.Cells[2].Value) * Convert.ToInt32(LigneCommande.Cells[1].Value);
                        }
                        else
                        {
                            LigneCommande.Cells[2].Value = Convert.ToInt16(LigneCommande.Cells[2].Value) + Convert.ToInt16(numericUpDownCommande.Value);
                            LigneCommande.Cells[3].Value = Convert.ToInt16(LigneCommande.Cells[2].Value) * Convert.ToInt16(LigneCommande.Cells[1].Value);
                        }
                    }
                }
                if (dejaCommande == false) //si la ligne n existe pas dans la commande
                {
                    //ajout de la ligne sinon
                    dataGridViewCommande.RowCount++;
                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[0].Value = dg.Cells[0].Value;
                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[1].Value = dg.Cells[1].Value;
                    if ((Convert.ToInt32(numericUpDownCommande.Value)) > Convert.ToInt32(dg.Cells[2].Value)) //si la quantité demandée depasse la quantitée disponible
                    {
                        dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[2].Value = Convert.ToInt32(dg.Cells[2].Value);
                    }
                    else dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[2].Value = numericUpDownCommande.Value;

                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[3].Value = Convert.ToInt16(dg.Cells[1].Value) * Convert.ToInt32( dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[2].Value);
                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[4].Value = dg.Cells[3].Value;
                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[5].Value = 0;
                    dataGridViewCommande.Rows[dataGridViewCommande.RowCount - 1].Cells[6].Value = "add";

                }
                CalculerNouveauPrixTotal();
            }
        }

        private void supprimerLigneCommande_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow drg in dataGridViewCommande.SelectedRows)
            {
                dataGridViewCommande.Rows.Remove(drg);
            }
            CalculerNouveauPrixTotal();
        }
        private void buttonFinCommande_Click(object sender, EventArgs e)
        {
            if (!System.IO.File.Exists("C:/Gestion")) //Vérifie que le dossier gestion existe, si il n'existe pas, il le créé
            {
                System.IO.Directory.CreateDirectory("C:/Gestion"); //Création du fichier gestion
            }
            StreamWriter ticket = new System.IO.StreamWriter("C:/Gestion/" + "ticket.txt"); //Met le fichier texte dans le fichier gestion
            decimal totalcommande;
            string temptik;
            Int16 unSeulClientALaFois = 0, count;
            int numindex=0;
            foreach (DataGridViewCell cellules in dataGridView1.SelectedCells) // on selectionne toutes les lignes selectionées partilement
            {
                if (unSeulClientALaFois < 1)
                {
                    numindex = cellules.RowIndex;
                    unSeulClientALaFois++;
                }
                else
                {
                    cellules.Selected = false;
                }
            }
            dataGridView1.Rows[numindex].Selected = true;

            totalcommande = 0;
            string nomClient = ""; //Initialisation des variables servant à récupérer le resultat des requêtes SQL
            string prenomClient = ""; // Note : Si les variables ne sont pas initialisé en tant que "", le programme
            string adrClient = ""; // bug, car il refuse d'écrire dans un fichier texte une variable possiblement vide.
            
            //Bloc récupération du nom du client
            if (connex.State == ConnectionState.Closed) connex.Open(); //connection
            string sql = "Select NomClient from client where IdClient =" + (numindex+1); //requete (NB : num + 1 car il y a décalage)
            cmd = new SqlCommand(sql, connex);
            SqlDataReader drNom = cmd.ExecuteReader();
            while (drNom.Read()) //Lecture du datareader
            {
                nomClient = Convert.ToString(drNom.GetValue(0)); //Stockage dans la variable.
            }
            drNom.Close();
            connex.Close(); //Fermeture de la connection

            //Bloc récupération du prénom du client
            if (connex.State == ConnectionState.Closed) connex.Open();
            sql = "Select PrenomClient from client where IdClient =" + (numindex+1);
            cmd = new SqlCommand(sql, connex);
            SqlDataReader drPren = cmd.ExecuteReader();
            while (drPren.Read())
            {
                prenomClient = Convert.ToString(drPren.GetValue(0)); //Stockage du prénom dans la variable.
            }
            drPren.Close();
            connex.Close();

            //Bloc récupération de l'adresse du client
            if (connex.State == ConnectionState.Closed) connex.Open();
            sql = "Select NumAdressC, RueAdressC from client where IdClient =" + (numindex+1);
            cmd = new SqlCommand(sql, connex);
            SqlDataReader drAdr = cmd.ExecuteReader();
            while (drAdr.Read())
            {
                adrClient = Convert.ToString(drAdr.GetValue(0)) + " " + Convert.ToString(drAdr.GetValue(1));
            } //Le GetValue(0) représente le numéro de l'adresse, le GetValue(1) représente la rue
            drAdr.Close();
            connex.Close();

            //Ecriture de l'entête : Partie Client
            ticket.Write(prenomClient + " ");
            ticket.Flush();               //Flush permet de forcer l'écriture dans le fichier texte, sans le flush, il est
            ticket.WriteLine(nomClient);  //possible que visual studio garde en mémoire les variables sans les écrire
            ticket.Flush();               //car il prefere attendre qu'il y ai plus de choses en mémoire pour tout écrire d'un
            ticket.WriteLine(adrClient);  //coup et ainsi gagner du temps. Nous on veut qu'il écrive tout et sans faute, donc
            ticket.Flush();               //on flush régulierement, le temps de traitement n'étant pas long de base.
            ticket.WriteLine();
            //Ecriture de l'entête : Partie entreprise
            ticket.WriteLine("Nom de l'entreprise");
            ticket.WriteLine("17 rue des pissenlits");
            ticket.WriteLine("31270 Villeneuve-Tolosane");
            ticket.WriteLine("06 444 555 666");
            ticket.WriteLine();
            ticket.WriteLine("_______________________________"); //Création d'un semblant de look de tableau
            ticket.WriteLine("NOM             |QTE|TOTAL     |");
            ticket.WriteLine("_______________________________");
            foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
            {

                temptik = Convert.ToString(LigneCommande.Cells[0].Value);//On récupere le nom du produit dans la variable
                count = 0;
                foreach (char chartik in temptik)//Pour chaque lettre dans le nom du produit ...
                {
                    if (count < 16) //On écrit les 16 premières lettres, les suivantes sont ignorées
                    {
                        ticket.Write(chartik);
                    }
                    count++;
                }
                if (count < 16) //Dans le cas où le nom de produit fait moins de 16 lettres, on complète avec des espaces
                {               //Cette pratique est effectuée afin de garder un aspect constant au tableau, et non pas diforme
                    for (int i = count; i < 16; i++)
                    {
                        ticket.Write(" ");
                    }
                } 
                ticket.Write("|"); //Purement graphique, ça represente une colonne dans le tableau
                temptik = Convert.ToString(LigneCommande.Cells[2].Value); //On récupere la quantité dans la variable
                count = 0;
                foreach (char chartik in temptik) //Même opération que pour le nom
                {
                    if (count < 3)
                    {
                        ticket.Write(chartik);
                    }
                    count++;
                }
                if (count < 3)
                {
                    for (int i = count; i < 3; i++)
                    {
                        ticket.Write(" ");
                    }
                } 
                ticket.Write("|");
                temptik = Convert.ToString(LigneCommande.Cells[3].Value); //On récupere le prix total dans la variable
                count = 0;
                foreach (char chartik in temptik)//Même chose qu'au dessus
                {
                    if (count < 10)
                    {
                        ticket.Write(chartik);
                    }
                    count++;
                }
                if (count < 10)
                {
                    for (int i = count; i < 10; i++)
                    {
                        ticket.Write(" ");
                    }
                } 
                ticket.Write("|");
                ticket.WriteLine();
                ticket.Flush();
                totalcommande = totalcommande + Convert.ToDecimal(LigneCommande.Cells[3].Value); //On récupère le total de la commande
            }
            ticket.Write("_______________________________");
            ticket.WriteLine();
            ticket.Write("Prix total : ");
            ticket.Write(totalcommande);
            ticket.Flush(); //On écrit le total de la commande dans le bas du ticket


           
            connex.Open();
            DataGridViewRow ligneSelect = dataGridView1.SelectedRows[0];
            sql = "Select max(NumCommande) from commande";
            cmd = new SqlCommand(sql, connex);
            SqlDataReader dread = cmd.ExecuteReader();
            dread.Read();
            int indexmax;
            if (dread.IsDBNull(0) )
            {
                indexmax = 0;
            }
            else
            {
                indexmax = Convert.ToInt16(dread[0]);
            }
            dread.Close();
            indexmax++;
            sql = "Insert into commande values ("+ indexmax +"," +Convert.ToInt16( ligneSelect.Cells[2].Value )+ ",\' " + DateTime.Now.ToString() + "\')";
            cmd = new SqlCommand(sql, connex);
            SqlDataReader dr = cmd.ExecuteReader();
            dr.Close();

            foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
            {
                sql = "Insert into LigneCommande values (" + Convert.ToInt16(LigneCommande.Cells[4].Value) + "," + indexmax + "," + Convert.ToInt16( LigneCommande.Cells[2].Value) + ")";
                cmd = new SqlCommand(sql, connex);
                dr = cmd.ExecuteReader();
                dr.Close();
            }
            foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
            {
                sql = "Update Produit set QuantiteP=(QuantiteP - " + LigneCommande.Cells[2].Value + ") where IdProduit =" + LigneCommande.Cells[4].Value + " ; ";
                cmd = new SqlCommand(sql, connex);
                dr = cmd.ExecuteReader();
                dr.Close();
            }
            MessageBox.Show("commande effectuée");
            rafraichirProduit();
            ticket.Close();
        }

        private void button1_Click(object sender, EventArgs e)// ristourne sur un produit
        {
            radioButton1.Visible = true;
            radioButton2.Visible = true;
            label5.Visible = true;
            textBox1.Visible = true;
            button3.Visible = true;
            opereduc = 1;

            foreach (DataGridViewCell cellules in dataGridViewCommande.SelectedCells) // on selectionne toutes les lignes selectionées partilement
            {
                dataGridViewCommande.Rows[cellules.RowIndex].Selected = true;
            }
            var tabReduc = new List<Reduc>();

            foreach (DataGridViewRow LigneCommande in dataGridViewCommande.SelectedRows)
            {
                Reduc objet = new Reduc(Convert.ToInt32(LigneCommande.Cells[5].Value), Convert.ToString(LigneCommande.Cells[6].Value), Convert.ToInt32(LigneCommande.Index));
                tabReduc.Add(objet);
            }
           

        }

        private void button2_Click(object sender, EventArgs e) // ristourne general
        {
            radioButton1.Visible = true;
            radioButton2.Visible = true;
            label5.Visible = true;
            textBox1.Visible = true;
            button3.Visible = true;
            opereduc = 2;
        }

        private void supprimerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SuppProduit f8 = new SuppProduit("");
            f8.Show();
        }
        private void supprimerToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            SuppClient f7 = new SuppClient("");
            f7.Show();
        }

        private void modifierToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            ModifClient f5 = new ModifClient();
            f5.Show();
        }

        private void modifierToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ModifProduit f6 = new ModifProduit();
            f6.Show();
        }
        private void ajouterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AjoutProduit f4 = new AjoutProduit();
            f4.Show();
        }

        private void ajouterToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            AjoutClient f2 = new AjoutClient();
            f2.Show();
        }

        private void rafraichir_Click(object sender, EventArgs e)
        {
            rafraichirProduit();
            rafraichirclients();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int reduc;
            decimal temp;
            if (radioButton1.Checked == true)
            {
                typeReduction = "0";
            }
            else
            {
                typeReduction = "1";
            }
            reduc = Convert.ToInt16(textBox1.Text);
            if (opereduc == 1)
            {
                foreach (DataGridViewRow LigneCommande in dataGridViewCommande.SelectedRows)
                {
                     if (typeReduction == "0")
                    {
                        temp = Convert.ToDecimal(LigneCommande.Cells[1].Value);
                        temp = temp - reduc;
                        if (temp < 0)
                        {
                            temp = 0;
                        }
                        LigneCommande.Cells[1].Value = temp;
                    }
                    else
                    {
                        temp = Convert.ToDecimal(LigneCommande.Cells[1].Value);
                        temp = temp * (100 - reduc) / 100;
                        if (temp < 0)
                        {
                            temp = 0;
                        }
                        LigneCommande.Cells[1].Value = temp;
                    }
                }
                            CalculerNouveauPrixTotal();
            }
            else
            {
                Int32 Total = 0;
                foreach (DataGridViewRow LigneCommande in dataGridViewCommande.Rows)
                {
                    Total = Total + Convert.ToInt16(LigneCommande.Cells[2].Value) * Convert.ToInt16(LigneCommande.Cells[1].Value);
                }
                    if (typeReduction == "0")
                    {
                        Total = Total - reduc;
                        if (Total < 0)
                        {
                            Total = 0;
                        }
                    }
                    else
                    {
                        Total = Total * (100 - reduc) / 100;
                        if (Total < 0)
                        {
                            Total = 0;
                        }
                    }
                    TextBoxTotalPrixCommande.Text = Convert.ToString(Total);
            }
            radioButton1.Visible = false;
            radioButton2.Visible = false;
            label5.Visible = false;
            textBox1.Visible = false;
            button3.Visible = false;

        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
        /*public int valeur()
        {
            return 2;
        }*/

        public void show()
        {
            throw new NotImplementedException();
        }

        private void dataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void historique_commande_Click(object sender, EventArgs e)
        {
            HistoriqueCommandes f = new HistoriqueCommandes();
            f.Show();
        }
    }
}
